package pkg

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
)

var Logger *zap.Logger

// InitLogger 初始化zap日志库
func InitLogger() error {
	// 配置日志轮转（lumberjack）
	lumberjackLogger := &lumberjack.Logger{
		Filename:   "./logs/app.log", // 日志文件路径
		MaxSize:    10,               // 单个日志文件最大大小(MB)
		MaxBackups: 5,                // 保留旧日志文件的最大个数
		MaxAge:     30,               // 保留旧日志文件的最大天数
		Compress:   false,            // 是否压缩旧日志文件
	}

	// 关键修复：用zapcore.AddSync包装lumberjack，使其实现WriteSyncer接口
	logWriter := zapcore.AddSync(lumberjackLogger)

	// 创建日志编码器配置
	encoderConfig := zapcore.EncoderConfig{
		TimeKey:        "time",
		LevelKey:       "level",
		NameKey:        "logger",
		CallerKey:      "caller",
		MessageKey:     "msg",
		StacktraceKey:  "stacktrace",
		LineEnding:     zapcore.DefaultLineEnding,
		EncodeLevel:    zapcore.CapitalColorLevelEncoder,
		EncodeTime:     zapcore.ISO8601TimeEncoder,
		EncodeDuration: zapcore.SecondsDurationEncoder,
		EncodeCaller:   zapcore.ShortCallerEncoder,
	}

	// 区分开发/生产环境的编码器
	// 开发环境：ConsoleEncoder（带颜色、易读）
	// 生产环境：JSONEncoder（便于日志分析工具解析）
	encoder := zapcore.NewConsoleEncoder(encoderConfig)
	// 如果是生产环境，切换为JSON编码器：
	// encoder := zapcore.NewJSONEncoder(encoderConfig)

	// 配置多输出目标：控制台 + 文件
	multiWriter := zapcore.NewMultiWriteSyncer(
		//zapcore.Lock(os.Stdout), // 控制台输出（加锁保证并发安全）
		zapcore.Lock(logWriter), // 文件输出（lumberjack管理）
	)

	// 设置日志级别（DebugLevel最低，会输出所有级别日志）
	level := zapcore.DebugLevel

	// 创建日志核心
	core := zapcore.NewCore(encoder, multiWriter, level)

	// 创建logger实例，添加调用者和堆栈信息
	Logger = zap.New(core,
		zap.AddCaller(),                  // 记录调用者（文件名和行号）
		zap.AddStacktrace(zap.WarnLevel), // Warn及以上级别记录堆栈
	)

	return nil
}
